import utils
from typing import Optional
from datetime import datetime
from pydantic import BaseModel,Field,model_validator

class UserIn(BaseModel):
    """注册用户接口接受的数据格式"""
    username:str = Field(min_length=3,max_length=16)
    password:str = Field(min_length=6,max_length=16)
    mobile:str = Field(min_length=11,max_length=15)
    re_password:str

    @model_validator(mode='after')
    def check_password(self):
        """
        验证密码和确认密码是否一致
        :return: 务必返回当前对象
        """
        if self.password != self.re_password:
            raise ValueError("密码与确认密码不一致！")

        # 对密码进行哈希加密
        hashing = utils.Hashing()
        self.password = hashing.hash(self.password)

        # 必须有数据返回，否则该数据就丢失了
        return self

class UserOut(BaseModel):
    """注册成功返回数据格式"""
    id:int
    username:str
    avatar:Optional[str]  # 允许当前字段的值为None或者str
    sex:bool
    created_time:datetime
    updated_time:datetime

class LoginIn(BaseModel):
    """登录接口接受的数据格式"""
    account:str  # 账号或手机号
    password:str # 密码

class LoginOut(BaseModel):
    """登录成功返回数据格式"""
    code:int  # 操作结果，数字表示
    msg:str   # 操作结果，文本表示
    token:str # 登录凭证，证明用户已经登录